#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;

template <class T>
struct  Node
{
    T _data;
    Node *_next;
    Node *_prev;
    Node(const T &x):_data(x),_next(NULL),_prev(NULL)
    {}
};
template <class T>
class List
{
public:
    List();//这里头结点用T泛型的匿名变量来初始化
    List(const List<T> &L1);
    List<T> & operator=(const List<T> &L1);
    ~List();
    Node<T> * Insert( Node<T> * pos, const T& x );
    void Erase(Node<T> *pos);
    Node<T> * PushBack( const T &x );
    void PushFront(const T &x);
    void PopBack();
    void PopFront();
    size_t Size() const;
    bool Empty();
    const T & Back()const;
    const T & Front()const;
    void Clear();
    void Display();
protected:
    Node<T> *_head;
};
